/*
 * REL.java
 *
 * Created on 28 de Fevereiro de 2009, 17:14
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package compilador.analisadorSintatico.operacoes;

import compilador.analisadorLexico.Token;
import compilador.analisadorLexico.TokenClass;
import compilador.analisadorSintatico.Producao;
import compilador.analisadorSintatico.TokenReader;
import compilador.analisadorSintatico.simboloGramatical.NaoTerminal;
import compilador.analisadorSintatico.simboloGramatical.SimboloGramatical;
import compilador.analisadorSintatico.simboloGramatical.Terminal;

/**
 *
 * @author Joaquim Ranyere
 */
@Deprecated
public class REL extends Producao {
    
    //<REL> ::= <NRO> | '(' (<exp_arit> | <exp_REL>) ')'
    
    /** Creates a new instance of REL */
    public REL() {
    }
    
    public SimboloGramatical derivar() throws Exception {
        
        TokenReader tokenReader = TokenReader.getInstance();
        
        Token token = null;
        
        
        NaoTerminal thisNaoTerminal = new NaoTerminal(this.getClass().getSimpleName());
        
        
        thisNaoTerminal.add(new Terminal(tokenReader.seeCurrent()));
        
        
        token = tokenReader.seeCurrent();
        // deriva caso seja numero
        if (isNRO(token)){
            
            thisNaoTerminal.add(new NRO().derivar());
            
        }
        
        // deriva caso seja rela��o ou artimetica
        if (token.getTokenClass().equals(TokenClass.DELIMITADOR) && token.getAtributo().equals("(")) {
            
            tokenReader.consome();
            thisNaoTerminal.add(new Terminal(token));
            
            thisNaoTerminal.add(new EXP_REL().derivar());
            
            
        } else {
            erro("Operacao "+ this.getClass().getSimpleName() + " mal formada - De seus pulos...");
            return this.simbolo;
        }
        
        // caso consiga derivar rela��o ou aritmetica, verifica o ')'
        if (token.getTokenClass().equals(TokenClass.DELIMITADOR) && token.getAtributo().equals(")")) {
            tokenReader.consome();
            thisNaoTerminal.add(new Terminal(token));
            
        } else {
            erro("Operacao "+ this.getClass().getSimpleName() + " mal formada - De seus pulos...");
            return this.simbolo;
        }
        
        return thisNaoTerminal;
    }
    
    //Gambiarras...
    private boolean isNRO(Token t){
        if (t.getTokenClass().equals(TokenClass.OPERADOR) && t.getAtributo().equals("-") ||
                t.getTokenClass().equals(TokenClass.NUMERO) || t.getTokenClass().equals(TokenClass.IDENTIFICADOR)
                ){
            return true;
        }else
            return false;
        
    }

    @Override
    public void setSimbolo() {
        super.simbolo = new NaoTerminal("REL");
    }
    
}
